﻿using System;
using System.IO;
using System.Data;
using System.Windows;
using System.Collections;
using System.Windows.Input;
using System.ComponentModel;
using System.Windows.Controls;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.UI.Controls;
using Sinacor.UI.Bovespa.Corretagem.Model;
using Sinacor.UI.Bovespa.Corretagem.Presenter;
using Sinacor.Infra.UI.Controls.SmartClient;
using System.Collections.Generic;
using Sinacor.Infra.UI.Controls.SmartClient.Validation;

namespace Sinacor.UI.Bovespa.Corretagem.View.SmartClient
{
    /// <summary>
    /// Tela de Cadastro de Corretagem
    /// </summary>
    public partial class CadastroFaixasCorretagem : SinacorWindow, IFaixaCorretagem
    {
        #region Campos
        /// <summary>
        /// Campo de Faixa de Corretagem
        /// </summary>
        public Presenter.FaixaCorretagem PresenterFaixaCorretagem { get; set; }
        #endregion

        #region Construtor
        /// <summary>
        /// Construtor Padrão
        /// </summary>
        public CadastroFaixasCorretagem()
        {
            InitializeComponent();

            PresenterFaixaCorretagem = new Presenter.FaixaCorretagem(this);

            dtgFaixaCorretagem.NewItemType = typeof(Model.FaixaCorretagem);

            this.DataContext = PresenterFaixaCorretagem;

            AfterInitialize += new RoutedEventHandler(CadastroFaixasCorretagem_AfterInitialize);

            //eventos dos botões de pesquisa
            btnNovaPesquisa.OnBufferedClick += new SinacorButton.OnBufferClickHandler(btnNovaPesquisa_OnBufferedClick);
            btnPesquisar.OnBufferedClick += new SinacorButton.OnBufferClickHandler(btnPesquisar_OnBufferedClick);

            //eventos do grid
            dtgFaixaCorretagem.EndingInsert += new CancelItemEventHandler(dtgFaixaCorretagem_EndingInsert);
            dtgFaixaCorretagem.EndingUpdate += new CancelItemEventHandler(dtgFaixaCorretagem_EndingUpdate);
            dtgFaixaCorretagem.Deleting += new CancelItemsEventHandler(dtgFaixaCorretagem_Deleting);
        }
        #endregion

        #region Eventos do Grid

        /// <summary>
        /// Início da Inserção
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dtgFaixaCorretagem_BeingUpdated(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is BaseRow)
            {
                ((SinacorInt32TextBox)ControlHelper.FindChild(this.dtgFaixaCorretagem.GetEditRow(), "txtNumeroFaixa")).Focus();

            }
        }

        /// <summary>
        /// Deleção de linha
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void dtgFaixaCorretagem_Deleting(object sender, CancelItemsEventArgs e)
        {
            try
            {
                
                ClearServiceErrors();

                if (!this.PresenterFaixaCorretagem.ExcluirFaixaCorretagem((Model.FaixaCorretagem)this.dtgFaixaCorretagem.SelectedItem)) 
                {
                    e.Cancel = true;
                    return;
                }
                    
            }
            catch 
            {
                e.Cancel = true;
            }
        }

        /// <summary>
        /// Finalizar Linha de edição
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void dtgFaixaCorretagem_EndingUpdate(object sender, CancelItemEventArgs e)
        {
            try
            {
                if (e.OriginalSource is BaseRow)
                {
                    ClearServiceErrors();

                    if (!this.PresenterFaixaCorretagem.AlterarFaixaCorretagem((Model.FaixaCorretagem)this.dtgFaixaCorretagem.EditItem))
                        e.Cancel = true;
                }
            }
            catch 
            {
                e.Cancel = true;
            }
        }

        /// <summary>
        /// Finalizar linha de inserção
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void dtgFaixaCorretagem_EndingInsert(object sender, CancelItemEventArgs e)
        {
            try
            {
                if (e.OriginalSource is BaseRow)
                {
                    ClearServiceErrors();

                    if(!this.PresenterFaixaCorretagem.IncluirFaixaCorretagem((Model.FaixaCorretagem)this.dtgFaixaCorretagem.EditItem))
                        e.Cancel = true;
                }
            }
            catch
            {
                e.Cancel = true;
            }
        }

        /// <summary>
        /// Limpar Mensagens ao Cancelar a Inclusão
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dtgFaixaCorretagem_CancelingInsert(object sender, CancelItemEventArgs e)
        {
            ClearServiceErrors();
        }

        #endregion

        #region Botões
        /// <summary>
        /// Botão pesquisar
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        /// <param name="clickCount"></param>
        void btnPesquisar_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            this.ShowUserWaitingProcess();
            this.PresenterFaixaCorretagem.PesquisarFaixasCorretagem();
            this.HideUserWaitingProcess();
        }

        /// <summary>
        /// Botão Nova Pesquisa
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        /// <param name="clickCount"></param>
        void btnNovaPesquisa_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            this.PresenterFaixaCorretagem.Filtro = new Model.Parameter.FiltroFaixaCorretagem();
            this.dpDataInicialFiltro.UpdateTarget(SinacorDatePicker.ValueProperty);
            this.dpDataFinalFiltro.UpdateTarget(SinacorDatePicker.ValueProperty);
            this.PresenterFaixaCorretagem.ListaFaixasCorretagem = new ModelCollection<Sinacor.UI.Bovespa.Corretagem.Model.FaixaCorretagem>();
            this.AtualizarFaixasCorretagem();
            this.dpDataInicialFiltro.Focus();
        }

        /// <summary>
        /// Inicio da Inclusão
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dtgFaixaCorretagem_BeingInserted(object sender, CancelItemEventArgs e)
        {
            ClearServiceErrors();
        }

        #endregion

        #region Eventos da Tela
        /// <summary>
        /// Inicialização
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void CadastroFaixasCorretagem_AfterInitialize(object sender, RoutedEventArgs e)
        {
            this.ShowUserWaitingProcess();
            this.PresenterFaixaCorretagem.Inicializar();
            this.HideUserWaitingProcess();
        }

        /// <summary>
        /// Saída da Data
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void SinacorDatePicker_LostFocus(object sender, RoutedEventArgs e)
        {
            //verifica se já existe valor com essa data
            SinacorDatePicker dpDataInicial = (SinacorDatePicker)sender;
            if (dpDataInicial.Value != null)
                this.PresenterFaixaCorretagem.PrepararValoresPadraoNovaFaixa(dpDataInicial.Value.Value);
        }
        #endregion

        #region IFaixaCorretagem Members

        /// <summary>
        /// Atribui valores a linha
        /// </summary>
        /// <param name="model"></param>
        public void AtribuirDadosFaixaCorretagem(Sinacor.UI.Bovespa.Corretagem.Model.FaixaCorretagem model)
        {
            this.dtgFaixaCorretagem.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
            if (model != null && model.DataFinal.HasValue && model.NumeroFaixa.HasValue && model.ValorSuperior.HasValue)
            {
                decimal somavalorsuperior = 0.01M;
                ((Model.FaixaCorretagem)this.dtgFaixaCorretagem.EditItem).DataFinal = model.DataFinal;
                ((Model.FaixaCorretagem)this.dtgFaixaCorretagem.EditItem).NumeroFaixa = model.NumeroFaixa + 1;
                if(model.ValorSuperior + somavalorsuperior <= 9999999999999.99M)
                    ((Model.FaixaCorretagem)this.dtgFaixaCorretagem.EditItem).ValorInferior = model.ValorSuperior + somavalorsuperior;
                ((SinacorDecimalTextBox)ControlHelper.FindChild(this.dtgFaixaCorretagem.GetEditRow(), "txtValorInferior")).IsEnabled = true;
            }
            else 
            {
                ((Model.FaixaCorretagem)this.dtgFaixaCorretagem.EditItem).ValorInferior = 0;
                ((SinacorDecimalTextBox)ControlHelper.FindChild(this.dtgFaixaCorretagem.GetEditRow(), "txtValorInferior")).IsEnabled = false;
            }


        }

        /// <summary>
        /// Atualiza os dados do grid
        /// </summary>
        public void AtualizarFaixasCorretagem()
        {
            this.dtgFaixaCorretagem.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        /// <summary>
        /// Confirmação de exclusão de registro
        /// </summary>
        /// <returns></returns>
        public bool ConfirmarExclusao()
        {
            SinacorMessageBoxResult confirmacao = SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.Message.ConfirmaExclusao").ToString(), "", SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            return confirmacao == SinacorMessageBoxResult.Yes;
            
        }

        /// <summary>
        /// Informar Exclusão realizada
        /// </summary>
        public void InformaExclusaoRealizada()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.Message.ExclusaoRealizadaSucesso").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        /// <summary>
        /// Informar Alteração realizada
        /// </summary>
        public void InformarAlteracaoRealizada()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.Message.AlteracaoRealizadaSucesso").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        /// <summary>
        /// Informar Inclusão realizada
        /// </summary>
        public void InformarInclusaoRealizada()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.Message.InclusaoRealizadaSucesso").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        /// <summary>
        /// Informar nenhum registro encontrado
        /// </summary>
        public void InformarNenhumRegistroEncontrado()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.Message.NenhumRegistroEncontrado").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        /// <summary>
        /// Informa uma linha para exclusão
        /// </summary>
        public void InformarSelecaoLinhaParaExclusao()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.Message.SelecaoLinhaExclusao").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        /// <summary>
        /// Informa Valor Superior Menor Valor que Inferior
        /// </summary>
        public void InformarValorSuperiorMenorValorInferior()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Corretagem.ExceptionMessage.ValorSuperiorMenorValorInferior").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        #endregion
    }
}
